package com.example.musicserver.controller;

import com.example.musicserver.mapper.LoveMusicMapper;
import com.example.musicserver.mapper.MusicMapper;
import com.example.musicserver.model.Music;
import com.example.musicserver.model.User;
import com.example.musicserver.tools.Constant;
import com.example.musicserver.tools.ResponseBodyMessage;
import org.apache.ibatis.binding.BindingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 18446
 * Date: 2022-07-23
 * Time: 10:53
 */

@RestController
@RequestMapping("/music")
public class MusicController {

    @Value("${music.local.path}")
    private String SAVE_PATH /*= "E:/work/local/music"*/;

    @Autowired
    private MusicMapper musicMapper;

    @Autowired
    private LoveMusicMapper loveMusicMapper;

    @RequestMapping("/upload")
    public ResponseBodyMessage<Boolean> insertMusic(@RequestParam String singer, @RequestParam("filename") MultipartFile file, HttpServletRequest request, HttpServletResponse resp)throws IOException{
        //1.检查是否登录
        HttpSession httpSession = request.getSession(false);
        if(httpSession==null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY)==null){
            System.out.println("没有登陆!");
            return new ResponseBodyMessage<>(-1,"请登陆后上传",false);
        }



        //2.上传到服务器
        String fileNameAndType = file.getOriginalFilename();//  **.mp3
        System.out.println("fileNameAndType: " + fileNameAndType);

        String path = SAVE_PATH+"/" +fileNameAndType;

        File dest = new File(path);
        if(!dest.exists()) dest.mkdir();

        try {
            file.transferTo(dest);
            //return new ResponseBodyMessage<>(0,"上传成功",true);
        }catch (IOException e){
            e.printStackTrace();
            return new ResponseBodyMessage<>(-1,"服务器上传失败",false);
        }

        //return new ResponseBodyMessage<>(-1,"上传失败",false);

        //3.进行数据库的上传
        //1.准备数据  2.调用insert

        int index = fileNameAndType.lastIndexOf(".");
        String title = fileNameAndType.substring(0,index);

        User user =  (User) httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userid = user.getId();

        //1.播放音乐-》http请求
        String url = "/music/get?path=" + title;

        //2.时间
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        String time = sf.format(new Date());

        try{
            int ret = 0;
            ret = musicMapper.insert(title,singer,time,url,userid);
            if(ret==1){
                //这里·应该跳转到音乐列表界面
                resp.sendRedirect("/list.html");
                return new ResponseBodyMessage<>(0,"数据库上传成功",true);
            }else{
                return new ResponseBodyMessage<>(-1,"数据库上传失败",false);
            }
        }catch (BindingException e){
            dest.delete();
            e.printStackTrace();
            return new ResponseBodyMessage<>(-1,"数据库上传失败",false);
        }

    }

    @RequestMapping("/get")
    public ResponseEntity<byte[]> func(String path){
        File file = new File(SAVE_PATH + "/" + path);
        byte[] a = null;
        try {
          a = Files.readAllBytes(file.toPath());
          if(a==null){
              return ResponseEntity.badRequest().build();
          }else return ResponseEntity.ok(a);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.badRequest().build();
    }

    //删除单个音乐
    @RequestMapping("/delete")
    public ResponseBodyMessage<Boolean> deleteMusicById(@RequestParam String id){
        int iid = Integer.parseInt(id);

        Music music = musicMapper.findMusicById(iid);
        if(music==null) {
            System.out.println("没要这个id的音乐");
            return new ResponseBodyMessage<>(-1,"没有要删除的音乐",false);
        }else {
            int ret = musicMapper.deleteMusicById(iid);
            if(ret == 1){
                int index = music.getUrl().lastIndexOf("=");
                String fileName = music.getUrl().substring(index+1);//得到文件名

                File file = new File(SAVE_PATH+"/"+fileName+".mp3");
                System.out.println("当前的路径："+file.getPath());

                if(file.delete()){
                    //同步检查lovemusic中是否有这首音乐，有就删除
                    loveMusicMapper.deleteLoveMusicByMusicId(iid);

                    return new ResponseBodyMessage<>(0,"服务器当中的音乐删除成功",true);
                }
                else{
                    return new ResponseBodyMessage<>(-1,"服务器当中的音乐删除失败",false);
                }

            }else{
                return new ResponseBodyMessage<>(-1,"数据库中的音乐没有删除成功",false);
            }

        }
    }

    //批量删除音乐
    @RequestMapping("/deleteSel")
    public ResponseBodyMessage<Boolean> deleteSelMusicById(@RequestParam("id[]") List<Integer> id){

        System.out.println("所有的id:"+id);
        int sum = 0;
        for(int i = 0;i<id.size();i++){
            int musicId = id.get(i);
            Music music = musicMapper.findMusicById(musicId);
            if(music==null) {
                System.out.println("没要这个id的音乐");
                return new ResponseBodyMessage<>(-1, "没有要删除的音乐", false);
            }

            int ret = musicMapper.deleteMusicById(musicId);
            if(ret == 1){
                int index = music.getUrl().lastIndexOf("=");
                String fileName = music.getUrl().substring(index+1);//得到文件名

                File file = new File(SAVE_PATH+"/"+fileName+".mp3");
                System.out.println("当前的路径："+file.getPath());

                if(file.delete()){
                    //同步检查lovemusic中是否有这首音乐，有就删除
                    loveMusicMapper.deleteLoveMusicByMusicId(musicId);

                    sum+=ret;
                }
                else{
                    return new ResponseBodyMessage<>(-1,"服务器当中的音乐删除失败",false);

                }
            }else return new ResponseBodyMessage<>(-1,"数据库当中的音乐删除失败",false);
        }

        if(sum == id.size()){
            System.out.println("整体删除成功");
            return new ResponseBodyMessage<>(0,"音乐删除成功",true);
        }else {
            System.out.println("整体删除失败");
            return new ResponseBodyMessage<>(-1,"音乐删除失败",false);
        }
    }

    @RequestMapping("findMusic")
    public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required = false) String musicName){
        List<Music> musicList = null;
        if(musicName != null){
            musicList = musicMapper.findMusicByName(musicName);
        }else{
            musicList = musicMapper.findMusic();
        }

        return new ResponseBodyMessage<>(0,"查询到了所有的音乐",musicList);
    }
}





















